Como configurar Docker cuando está instalado en WSL para poder desplegar imagenes directamente con maven y spring-boot.
Si tenemos instalado el Docker Desktop en principio no tendríamos ningun problema al intentar generar una imagen en docker directamente usando maven y spring-boot, pero si en vez de tener docker desktop tenemos instalado docker en una distribución de WSL al intentar generar una imagen obtendremos el siguiente error:
[INFO] I/O exception (java.nio.file.NoSuchFileException) caught when processing request to {}->docker://localhost:2376: \\.\pipe\docker_engine
[INFO] Retrying request to {}->docker://localhost:2376
El error se produce porque Docker al instalarlo sobre WSL por defecto solo escucha en un socket local, unix:///var/run/docker.sock
Para solucionar el error tenemos que configurar el servicio de docker para que al levantarse se ponga a escuchar en un puerto tcp
Primero paramos el servicio de docker en nuestra distribucion de WSL con el siguiente comando:
sudo service docker stop
A continuación tenemos que editar el archivo /etc/init.d/docker
concretamente tenemos que editar la variable DOCKER_OPTS para incluir el siguiente contenido:
"-H unix:///var/run/docker.sock -H tcp://localhost:2376"
El contenido quedaría tal que así:
NOTA: en este caso estamos indicando el puerto 2376 si la aplicación que se conecta a docker lo hace por otro puerto pues tendríamos que poner ese puerto concretamente.
Una vez hecho esto solo tenemos que levantar el servicio
sudo service docker start
Ahora en nuestro sistema anfitrion (NO DENTRO DEL WSL) tenemos que declarar la variable de sistema DOCKER_HOST y darle el valor tcp://localhost:2376
Esto podemos hacerlo de varias maneras y depende del terminal que usemos tambien.
Si lo hacemos desde las variables de entorno (con la interfaz grafica de windows) tendremos que cerrar todas las terminales del VScode y reiniciar el IDE para que las terminales cojan el valor de la variable
Si lo queremos hacer directamente desde el terminal depende de si es un terminal tipo unix, cmd o PowerShell
Unix:
export DOCKER_HOST=tcp://localhost:2376
cmd:
set DOCKER_HOST=tcp://localhost:2376
PowerShell:
$env:DOCKER_HOST = 'tcp://localhost:2376'
Despues solo tenemos que ejecutar el comando para generar la imagen desde la consola:
mvn spring-boot:build-image
NOTA: cuidado porque si se ejecuta el goal para generar la imagen desde el IDE el propio IDE te puede abrir una nueva consola que no tenga definida la variable y no funcionará el comando.
El comando ya debería de encontrar la instancía de docker y conectarse para generar la imagen:
Docker Engine | Spring | WSL | deploy